﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;

namespace MxTol.API.Helpers
{
    /// <summary>
    /// API接口调用安全验证码
    /// </summary>
    public class SafeKeyHelper
    {
        private static readonly string SECRET_KEY = "mx_cjb_cy";

        /// <summary>
        /// 生成安全码
        /// </summary>
        public static string GetSafeKey()
        {
            string time = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss");

            // 异或加密
            string xor = XOR(time, SECRET_KEY);

            // 将加密后的字符串进行Base64编码
            return Convert.ToBase64String(Encoding.Unicode.GetBytes(xor));
        }

        /// <summary>
        /// 验证安全码的合法性
        /// </summary>
        public static bool VerifySafeKey(string safeKey)
        {
            bool is_right = false;
            try
            {
                // 解决Base64传输过程中"+"悲痛替换为空格问题
                string base64 = safeKey.Trim().Replace(' ','+');

                // 将安全码进行Base64解码
                string xor_string = Encoding.Unicode.GetString(Convert.FromBase64String(base64));

                // 再使用异或算法解密
                string old_time = XOR(xor_string, SECRET_KEY);

                // 三分钟有效
                TimeSpan span = DateTime.UtcNow - Convert.ToDateTime(old_time);
                if (span.TotalSeconds < Convert.ToDouble(180))
                {
                    is_right = true;
                }
            }
            catch (Exception)
            {
                is_right = false;
            }

            return is_right;
        }

        // 获取字符串所有字符ASCII码的总和
        private static int GetTotalAsciiCode(string str)
        {
            int total = 0;
            try
            {
                foreach (var c in str)
                {
                    total += Convert.ToInt32(c);
                }
            }
            catch
            {
                total = 0;
            }
            return total;
        }

        // 异或加密解密函数
        private static string XOR(string src, string secret)
        {
            // 获取密钥btye数据
            byte secret_byte = (byte)GetTotalAsciiCode(secret);

            byte[] bytes = Encoding.Unicode.GetBytes(src);

            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] = (byte)(bytes[i] ^ secret_byte);
            }

            return Encoding.Unicode.GetString(bytes);
        }
    }
}